package cn.iocoder.yudao.module.system.service.ai;

import cn.iocoder.yudao.module.system.dal.dataobject.ai.AiAdmissionCutoffScoreDO;
import cn.iocoder.yudao.module.system.dal.dataobject.college.CollegeDO;
import cn.iocoder.yudao.module.system.dal.dataobject.gugu.MajorAdmissionDO;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * AI志愿推荐缓存服务
 * 使用Redis缓存减少数据库查询，提升性能
 * 
 * @author 芋道源码
 */
@Service
public interface AiVolunteerRecommendCacheService {

    /**
     * 缓存学校基础信息（很少变化，缓存时间长）
     * 
     * @param schoolUuids 学校UUID列表
     * @return 学校信息Map
     */
    @Cacheable(value = "ai:college:info", key = "#schoolUuids.hashCode()", unless = "#result == null || #result.isEmpty()")
    Map<String, CollegeDO> getCollegeInfo(List<String> schoolUuids);

    /**
     * 缓存历史录取数据（历史数据不会变化，可以永久缓存）
     * 
     * @param schoolUuids 学校UUID列表
     * @param province 省份
     * @param year 年份
     * @param classify 类型
     * @param batch 批次
     * @return 历史录取数据Map
     */
    @Cacheable(
        value = "ai:history:admissions", 
        key = "#schoolUuids.hashCode() + ':' + #province + ':' + #year + ':' + #classify + ':' + #batch",
        unless = "#result == null || #result.isEmpty()"
    )
    Map<String, List<MajorAdmissionDO>> getHistoryAdmissions(
            List<String> schoolUuids, 
            String province, 
            Integer year, 
            String classify, 
            String batch);

    /**
     * 缓存AI录取分数线数据（当年数据，缓存时间适中）
     *
     * @param schoolNames 学校名称列表
     * @param year        年份
     * @param classify    类型
     * @param batch
     * @return AI录取分数线数据列表
     */
    @Cacheable(
        value = "ai:cutoff:scores",
        key = "#schoolNames.hashCode() + ':' + #year + ':' + #classify",
        unless = "#result == null || #result.isEmpty()"
    )
    List<AiAdmissionCutoffScoreDO> getCutoffScores(
            List<String> schoolNames,
            Integer year,
            String classify, String province, String batch);
    
    /**
     * 【优化】批量查询AI录取分数线（使用schoolUuid）
     * 使用school_uuid查询，相比学校名称更精确高效
     */
    List<AiAdmissionCutoffScoreDO> getCutoffScoresByUuids(
            List<String> schoolUuids,
            Integer year,
            String classify, String province, String batch);
}


